/********************************************************************
*                                                                   *
* Microsoft Windows Sidebar Gadget for NNTT.ORG                     *
* Released under the MIT license by Alexey Glukharev, Januar 2012.  *
*                                                                   *
********************************************************************/

//----------------------------------------
// CuTorrentDataProvider
//----

// Constructor
CuTorrentDataProvider = function (options) {
    var self = this;
    
    // Внутренний массив элементов, заполняется json данными
    self.g_data =[];
    self.g_btRegExp = new RegExp("http:\/\/bt\.nntt\.org\/announce", "i");
    self.g_token = "";
    
    // Опции по умолчанию
    self.g_options = {
        protocol: "",
        host: "",
        port: "",
        user: "",
        password: "",
        error: function (err) {
            System.Debug.outputString("Error occurred: " + err);
        }
    };
    
    // Merge options
    // To keep the correct set of properties we will update only the known properties
    for (var i in self.g_options) {
        if (typeof (options[i]) != 'undefined') {
            self.g_options[i] = options[i];
        }
    }
    
    //----------------------------------------
    // Приватные методы класса
    //----
    
    // Получает токен сессии
    self.getToken = function (callback) {
        $.when($.ajax({
            cache: false,
            type: "GET",
            url: self.g_options.protocol + "://" + self.g_options.user + ":" + self.g_options.password + "@" + self.g_options.host + ":" + self.g_options.port + "/gui/token.html",
            dataType: "html"
        }))
        .done(function (msg) {
            // Выделяем сам токен
            self.g_token = $("<div>", {
                html: msg
            }).find("#token:first").text();
            
            // Вызовем функцию ещё раз
            callback();
        })
        .fail(function (xhr, status, error) {
            self.onError(xhr, status, error, callback);
        });
    }
    
    // Получает список торрентов
    self.getTorrentList = function () {
        return $.ajax({
            cache: false,
            type: "GET",
            url: self.g_options.protocol + "://" + self.g_options.user + ":" + self.g_options.password + "@" + self.g_options.host + ":" + self.g_options.port + "/gui/?token=" + self.g_token + "&list=1",
            dataType: "json"
        });
    }
    
    // Получает данные конкретного торрента
    self.getTorrentFileInfo = function (hash) {
        return $.ajax({
            cache: false,
            type: "GET",
            url: self.g_options.protocol + "://" + self.g_options.user + ":" + self.g_options.password + "@" + self.g_options.host + ":" + self.g_options.port + "/gui/?token=" + self.g_token + "&action=getprops&hash=" + hash,
            dataType: "json"
        });
    }
    
    // Вспомогательная функция для последовательной загрузки
    self.nextLoad = function (listData, index, callback) {
        var hash = listData.torrents[index][0];
        $.when(self.getTorrentFileInfo(hash)).done(function (msg) {
            // За время обработки торрент уже мог быть удалён,
            // поэтому проверим ответ клиента перед обработкой
            if (msg.props) {
                // Если торрент принадлежит nntt, добавим его в массив для дальнейшей обработки
                if (self.filter(msg.props[0].trackers)) {
                    self.g_data.push(listData.torrents[index]);
                }
            }
            
            // Если конец списка торрент-файлов ещё не достигнут, продолжим
            if (index + 1 < listData.torrents.length) {
                self.nextLoad(listData, index + 1, callback);
            } else {
                // Обход закончен - считаем статистику и вызываем callback функцию
                var up = 0;
                var down = 0;
                for (var i = 0; i < self.g_data.length; i++) {
                    up += self.g_data[i][8];
                    down += self.g_data[i][9];
                }
                callback({
                    "down": down, "up": up
                });
            }
        })
        .fail(function (xhr, status, error) {
            self.onError(xhr, status, error, function () {
                self.nextLoad(listData, index, callback);
            });
        });
    }
    
    // Фильтрует торренты, принадлежащие nntt
    self.filter = function (trackers) {
        return self.g_btRegExp.test(trackers);
    }
    
    // Вызывается при ошибке запроса
    self.onError = function (xhr, status, error, callback) {
        if (xhr.status == 400) {
            // Вероятно отсутствует корректный токен - запросим новый
            self.getToken(callback);
        } else {
            // Возникла ошибка - массив, вероятно, некорректно заполнен, обнулим его
            self.g_data =[];
            self.g_options.error("Unable to get statistic");
        }
    }
    return self;
};

// Methodes
CuTorrentDataProvider.prototype.getData = function (callback) {
    var self = this;
    
    // Обнулим массив с данными
    self.g_data =[];
    
    // Запустим механизм заполнения массива
    $.when(self.getTorrentList()).done(function (msg) {
        self.nextLoad(msg, 0, callback);
    })
    .fail(function (xhr, status, error) {
        self.onError(xhr, status, error, function () {
            self.getData(callback);
        });
    });
};